9. 実世界プログラミング
一般のプログラミング
プログラムは計算機の中
扱う対象も計算機の中
ネット上の計算機も含まれる
一般のプログラミング
計算機の中に無い情報は扱えない
自宅の戸締り
温度
匂い
気分
体重
店の混み具合
計算機外の情報
時刻
(天気)
実世界プログラミング
プログラムが計算機の外
扱う対象が計算機の外
c.f. 実世界指向インタフェース
キーボードやモニタ以外で計算機を操作
壁、机、etc.
ユビキタスコンピューティング
ウェアラブルコンピューティング
Tangible Bits
Augmented Reality
AR/VR
最近とても人気
AR = Augmented Reality
VR = Virtual Reality
MR = Mixed Reality
Pokemon Go
https://www.youtube.com/watch?v=7ZrmPTPgY3I
ARKit
https://www.youtube.com/watch?v=khavGQ7Dy3c
ARKit3
https://www.youtube.com/watch?v=vkS-VqAss4s
Soccer On Your Tabletop (HoloLens)
https://www.youtube.com/watch?v=eRGAB4QBS6U
Oculus Quest (VR)
https://www.youtube.com/watch?v=Di7dIhUFsbw
Augmented Reality
https://gyazo.com/788ed6a2f3313d09ab84acb2894c5b3e.png
MetaDesk
Tangible Bitsの例
Phicon (= Physical Icon)を入力に使用
プロジェクタから背面投射された机
https://gyazo.com/f341c5536bd26aad812719092003d870.png
https://gyazo.com/6e28f9a4e0dcb328727be90997ae2aff.png
https://www.youtube.com/watch?v=FsHHYK_UXkw
将来の計算機環境
計算機環境はユビキタスになる
⇒ プログラム実行環境がユビキタス
⇒ プログラミング環境もユビキタス
実世界プログラミングが重要に
https://gyazo.com/58f02171c6540154d9dd67e4457df12e
分類
実世界の対象を扱うプログラムを普通にプログラミング
一般的なUbiComp
テキスト言語などを利用
実世界の対象を扱うプログラムを実世界でプログラミング
例示プログラミング
ビジュアルプログラミング
実用になっている実世界プログラミング
目覚まし時計
炊飯器
レシピ
ピタゴラマシン
aka ループ・ゴールドバーグ・マシン
アナログ目覚まし時計
https://gyazo.com/d7f9ef0eb7338c3ef727a0b95369eb87
操作するもの(時刻とベル)と実物とのマッピングが自明
「時間」と「針」のマッピングが脳にしみ込んでいる
(教育の結果)
プログラミングとプログラム実行が同じ動き
プログラミング = 針を動かす
プログラムの動き = 針が動く
四角を描くプログラムと四角い図形とは全然違う
タイマつきコーヒーメーカー
https://gyazo.com/5c8ed7b084477d34a03816eac424210e
デジタル時計と時刻のマッピングは難しい
かろうじて誰でも使えるレベル?
時限爆弾
導火線はわかりやすい
http://gyazo.com/75e5c90e25d20e582c45d39aea837ffd.png
デジタル表示の爆弾はわかりにくい
ルーブ・ゴールドバーグ・マシン
実はわかりやすい!?
http://gyazo.com/210eaff521cdc11af3bbb37592f054c5.png
Video: The Way Things Go
https://www.youtube.com/watch?v=GXrRC3pfLnE
c.f. 状態遷移機械
ピタゴラマシン的なわかりやすさ
http://gyazo.com/c0d7354659a4eaa51af15edfa5c542b7.png
実世界プログラミングでやりたいこと
7時になったらベルが鳴る
電話をとるとTVが消える
アメリカに行くと時計のタイムゾーンが切りかわる
夜に駅に行くと終電時刻が表示される
印刷された文書を机に置くとファイルがあらわれる
実世界プログラミングでやりたいこと
長野の山が白くなったらスキー情報をダウンロードする
郵便局の近くに来ると手紙を出すことを思い出させる
誕生日が近づくとプレゼントを思いだす
重要なメールが来ると「至急!」タグつきで印刷される
壁のボタンを押すと赤外線が出てテレビがつく
実世界プログラミングでやりたいこと
図書データを本から吸いあげる
雨がふると物干竿にメールが届いて洗濯物を取り入れる
ルーチンワークを行なうとマクロが自動登録されてカードに印刷される
「コピー棒」を近づけると同じ文書が印刷される
机の上に未知の物を置くと内容が教えてもらえる
実世界情報を扱うWebサービス
配送チェック
地図サービス
天気予報
乗換案内
実世界情報を利用する例
http://gyazo.com/82174232cc357d0afb5b8e6b21afbc92.png
http://www.water.go.jp/yoshino/ikeda/sameura/same_top.html https://gyazo.com/b94bcb2f2efcbcc06250d2704bb7dcd0.png
実世界プログラミングの利点
具体的
シンボルが不要
操作したいものが明白
ex. ビデオ予約システムの実世界化
プログラミングと実際の操作を同じにしてみる
時計を未来に回してから再生操作をする、など
実世界プログラミングの関連パラダイム
例示プログラミング
ビジュアルプログラミング
全世界プログラミング
実世界プログラミングに必要なもの
ネットワーク
センサ / 入出力デバイス
プログラミング要素
これらの融合が大事
最近のセンサ/組込みマイコン
mbed
Galileo
Edison
M5Stick
Phidgets
USB接続のセンサ/アクチュエータ
http://gyazo.com/f380ac7de41e16cb8635243956ae886c.png
Arduino
USB/Serial + AVR
http://gyazo.com/ba0f1f2dd89edcd0b5d9d2630fec4e04.png
Arduinoのプログラミング
Processingと同じIDE
http://gyazo.com/4229d5702f06eeeba00c9fc7dba14b7f.png
LilyPad
Wearable Arduino
http://gyazo.com/d69ad7cad9a36bcd1e9cd4e315b7dd1a.png
LilyPad
http://gyazo.com/54cd28dda035ebee0eff4efc33ee8d51.png
mbed
Web-programmable one-board computer
http://gyazo.com/d21d725a11af5e9cd6cdba2de538b7e8.png
Raspberry Pi
ARM-based one-board computer
Linux
http://gyazo.com/8eec26e91d9b97c806de1e32c6cabbcf.png
https://gyazo.com/3ad0a619c859b94324cc2bc4212bcefe
Intel Galileo
Linux + Arduino
http://gyazo.com/022769af99c411731730a31e3bec67d0.png
Intel Edison
http://gyazo.com/990178c9f83a96d1d2d779f40af7dbd0.png
XBee
ZigBee module
http://gyazo.com/a71ddd6ded18a47281748008ec9b5006.png
WiPort
WiFi + CPU + server
http://gyazo.com/a4ed7e2872f8ebfea6d01d6be65c2bab.png
obniz
https://obniz.io/ https://gyazo.com/4e9cf89dc39b68fc8aae2f86b36679fb
JavaScript-based board
https://gyazo.com/692fa434340a4f6b17a4e78d4c21d806https://gyazo.com/342f6adedd20b615f05d3d432c6b86db
ESP32
SDカード
ボタン3個
320*240ディスプレイ
バッテリ
I/Oピン
WiFi / Bluetooth
iBeacon
Bluetooth Low Energy利用
低電力でIDを飛ばすことができる
http://gyazo.com/0848c9a63fc580b748d9db6f89e6e065.png
http://gyazo.com/8921282d50d982e7e42f8d91301a4267.png
プログラミングモデル
例示系プログラミング
イベント駆動
実世界ビジュアルプログラミング
様々なシステム
センサネットワーク
AhroDによるイベント駆動システム
ifttt
Phidgetsによる実世界と計算機世界の融合
Stanfordのd.tools
FieldMouse, MouseField
Lindaによる全世界プログラミング
NEC 早川氏、神戸大 塚本氏ら
「ECAルール」でプログラミング
http://gyazo.com/fdbe87d65d516e38708f39556dfa6c2c.png
http://gyazo.com/2be95ac8bfa17b5ccf1933d1f1cd6298.png
ECA rules
code:eca.txt
DEFINE Rule-ID
WHEN Event_type (E)
IF Condition (C)
THEN Action (A)
実世界プログラミングでやりたかったこと
7時になったらベルが鳴る
電話をとるとTVが消える
...
大抵はECAルールで充分
「その場でプログラミング」
神戸大 寺田努氏ら
「その場でプログラミング」例1
本屋に来て立ち読みをしたところ,この本を購入したいと思ったが手持ちのお金がない.次にこの本屋の前を通りかかったときにはこれを買うことを忘れないようにリマインダを提示させることにした.
「その場でプログラミング」例2
迷いやすい場所に向かうので地図を表示したいが,常に表示されていると邪魔なので,立ち止まったときだけヘッドマウントディスプレイ上に地図を表示するようにした.
「その場でプログラミング」例3
ジョギングに出かけたが,医者に激しい運動を止められていることを思い出し、心拍が高かったり早く走っている期間が1分以上続いたりしたらアラートを出すようにした.
「その場でプログラミング」例4
今月はちょっと浪費気味なので,財布を出すたびに「無駄遣いするな」と表示することにした
必要な技術
簡単なプログラミングモデル
動的なプログラム変更
コンテキストの定義
ifttt
「IF This, Then do That」
「レシピ」を作る
twitterでハッシュタグ「#fb」を付けたものだけを、自動的にfacebookに投稿する
YouTubeを見ていて「後で見る」に追加したものだけをEvernoteに自動保存する
Instagramでハッシュタグ「#mydrop」を付けたものだけを、自動的にDropboxに保存する
「Weather」で明日の天気が「雨」の場合にだけ、Gメールへ自動通知する
Phidgets
カルガリー大学で開発
センサと画面上のGUIをリンクする研究
USBセンサ群を販売中
http://gyazo.com/076035dc841ef41a9099e8e71e133477.png
Stanfordのシステム
Scott Klemmer氏、Björn Hartmann氏ら
ビジュアルプログラミング、例示プログラミング
d.tools
計算機情報と物理装置をリンク
例示+ビジュアルプログラミング
http://gyazo.com/ef285a1ee1411fd4c98d4aada8e37ef1.png
Video: d.tools
https://s3-ap-northeast-1.amazonaws.com/masui.org/3/8/381d0ab506299bb4eb7574f842442f8c.mp4
新しいデバイス例: FieldMouse
ID認識装置 + 動き検出装置
壁や机の上でマウスのように使える
http://gyazo.com/74bde9533bd105d2ebe6c8f9d5906a0d.pnghttp://gyazo.com/05ff3e0cff55836d3b35a72174de2410.png
FieldMouseを使った実世界GUI
http://gyazo.com/2593d8fafcf5b4074439079cca1f9d66.png
新しいデバイス例: MouseField
手軽な実世界I/Fデバイス
RFIDリーダと動き検出装置を一体化
http://gyazo.com/dcb16fd6194a15b459d2502ca627d2d1.png
MouseFieldの使用方法
「置いて動かす」だけで情報検索/制御
http://gyazo.com/e98258a8a47de176282e2ed148e7db18.png
書斎のMouseField
http://gyazo.com/f475336f971c564980a6368947e15180.png
テーブル型MouseField
http://gyazo.com/c42e22616d9c306acab92c742416a886.png
PlayStand++
http://gyazo.com/8abd64e12f203964e582cdc675b3fe45.png
PlayStand++の操作
http://gyazo.com/024b85c0aed15a9308436eaf2fd448fc.png
Video: MouseField
https://www.youtube.com/watch?v=w-nEPbptLO8
IT Whitebox (2011/6/19)
Real-world copy/paste
https://www.youtube.com/watch?v=1di7_2J8X0Y
http://gyazo.com/18b298f2b2a2851978504fcd46503938.png
GoldFishサーバ
TinyURL, Bit.ly的
実行例1: マニュアルの表示
http://gyazo.com/a2dcd1bfa983b4c8b81e406085e59c47.png
http://gyazo.com/de0fe7498b3a1fe856e07002f9a7ae1b.png
実行例3: 回転インタフェース
http://gyazo.com/b06aee214b542952125f0d8a0ecb7abf.png
http://gyazo.com/f38d032e1c317e1bac30d52581b8317b.png
ドア開閉
http://www.youtube.com/watch?v=03sh3cXrXuw
http://gyazo.com/ab301f469b9266c3f2d2ed07db3f7c22.png
http://gyazo.com/f00aef03e85ef6b1a838c527825a21fc.png
ドア開閉のソース
http://gyazo.com/129c69de3b13912a532dbdec458ed5c3.png
実世界コピペ
http://gyazo.com/96ed656fe1f1007c299ec3817f4fe8d1.png
全世界の情報を利用
辻堂の波, 楽天の株価, ...
全世界の機械を制御
情報家電, 自宅の照明, ...
全世界の人間が作成
ホビープログラマ, メディアアーティスト, ...
全世界プログラミングの例 (1)
目覚まし時計
炊飯の予約
風呂の水はり
全世界プログラミングの例 (2)
人がいない部屋のテレビを消す
人がいない部屋では目覚ましを鳴らさない
ビールがなくなると注文フォームを表示する
気合いを入れるとブックマークされる
寝ると照明が消える
夜になると静かになる空気清浄機
汚いと自動的に洗浄してくれるトイレ
全世界プログラミングの例 (3)
遠方の家族の様子を知る
水道が使われていないと通報する
泥棒を検出
波や風の様子を調べる
全世界プログラミングの例 (4)
ブログが炎上すると警報が鳴る
ニューヨークの天気でBGMを変化させる
全世界ピタゴラマシン
....
https://s3-ap-northeast-1.amazonaws.com/masui.org/6/c/6c3e200cc1b7ea1d332ac9a4680fe0c9.png
Phidgets programming
code:phidgets.java
import Phidgets.*;
public class IFKex1 extends _IPhidgetInterfaceKitEventsAdapter
{
public void OnSensorChange(_IPhidgetInterfaceKitEvents_OnSensorChangeEvent ke) {
System.out.println("SensorChange: " + ke.get_SensorValue());
}
public void OnInputChange(_IPhidgetInterfaceKitEvents_OnInputChangeEvent ke) {
System.out.println("InputChange: " + ke.get_Index() + " " + ke.get_NewState());
}
public void OnDetach(_IPhidgetInterfaceKitEvents_OnDetachEvent ke) {
System.out.println("FINISHED!");
}
public static void main(String[] args) {
new IFKex1();
}
public IFKex1()
{
PhidgetInterfaceKit phid = new PhidgetInterfaceKit();
phid.add_IPhidgetInterfaceKitEventsListener(this);
if (phid.Open(false) == false)
{
System.out.println("Could not find a PhidgetInterfaceKit");
return;
}
System.out.println(phid.GetDeviceType());
System.out.println("Serial Number " + phid.GetSerialNumber());
System.out.println("Device Version " + phid.GetDeviceVersion());
phid.SetSensorChangeTrigger(7, 1);
phid.start();
System.out.println("Looping...\n");
for(int i = 0; i < 1000; ++i)
{
phid.SetOutputState(0,true);
}
// Turn the output on, and rudely leave it turned on!
phid.Close();
System.out.println("Closed and exitting...");
}
}
Phidgetsプログラミングの問題点
C, Javaなどの開発環境が必要
言語ごとに異なるライブラリが必要
マイナーな言語から使えない
リモートのPhidgetsを制御できない
Phidgets Server
Phidgetsの入出力をTCP/IPで制御
任意の言語/環境を利用可能
by 塚田浩二@お茶の水女子大
MobiServer
Phidgets, X10, KURO-RS, XBeeを制御
by 塚田浩二@はこだて未来大学
https://gyazo.com/094eb1ca6d685cc52c624ccaf664e00f.png
気合いブックマークプログラム in Ruby
code:bookmark.rb
require "socket"
require "delicious"
PORT = 4321
HOST = "phidget.server.host"
USER = "masui"
server = TCPSocket.open(HOST,PORT)
while true
s = server.gets
break if s.nil?
a = s.split(/,/)
if weight > 4.0 then
register(USER)
end
end
end
プレゼンプログラム in Ruby
code:presentation.rb
require "socket"
require "dl/import"
module Win32
extend DL::Importable
typealias "DWORD", "unsigned long"
typealias "BYTE", "unsigned char"
typealias "ULONG", "unsigned long"
KEYEVENTF_KEYUP = 0x02
VK_SHIFT = 0x10
VK_A = 0x41
VK_SPACE = 0x20
VK_BACKSPACE = 0x08
dlload "user32.dll"
extern "void keybd_event(BYTE, BYTE, DWORD, ULONG)"
def send_keybd_event(bVk, dwFlags = 0)
keybd_event(bVk, 0, dwFlags,0)
end
module_function :send_keybd_event
end
serverhost = 'localhost'
port = 4321
socket = TCPSocket.new(serverhost, port)
prevval0 = 0
prevval2 = 0
while line = socket.gets
(io,device,ad,portno,val) = line.chomp.split(/,/)
if io == 'In' && device == 'InterfaceKit' &&
ad = 'Analog' && portno.to_i == 0 then
if val.to_i > 100 && prevval0 < 100 then
Win32.send_keybd_event(Win32::VK_SPACE)
Win32.send_keybd_event(Win32::VK_SPACE,
Win32::KEYEVENTF_KEYUP)
end
prevval0 = val.to_i
end
...
Phidgets Serverプログラミングの問題
サーバのアドレスやポートを意識する必要がある
並列処理が面倒
複数のサーバを同時に扱いにくい
Linda
https://s3-ap-northeast-1.amazonaws.com/masui.org/5/c/5c79a78e3de1dcec20999cedfc5ddfad.png
Linda利用の利点
サーバのアドレスを意識しない
ひとつの共有空間を利用して通信
手軽な並列処理
Phidgets以外のセンサも利用可能
居場所通知
ネット風速計
X10
赤外線リモコン
指紋センサ
パソコン内蔵傾きセンサ
Rinda
RubyによるLindaの実装
by 関氏
Rubyで簡単にLindaを利用できる
× Ruby以外の言語が使えな
Programming Rinda
code:rinda.rb
require 'rinda/rinda'
require 'delicious'
TS_URI = 'druby://localhost:12345'
USER = 'masui'
ts = DRbObject.new(nil,TS_URI) # Connect to tuple space
while true
register(USER) if val > 4.0
end
Webサーバ上のLindaプログラミング
Webサーバ上でデータ共有/同期
様々なWeb情報と実世界デバイスが通信
LindaによるWeb上の通信
"say", "hello" というタプル
"door", "open" というタプル
Lindaを使うプログラミング
現在のおすすめ
PC + Phidgets
ちょっと古臭いが手軽
PC + Arduino/Firmata
Phidgetsと同様に使える
Android + Arduino
各種センサをArduinoで読んでAndroidで制御
http://shokai.github.io/ArduinoFirmata-Android/images/led.gif http://shokai.github.io/ArduinoFirmata-Android/images/cds.gif http://shokai.github.io/ArduinoFirmata-Android/images/led.gif
https://gyazo.com/8be8ffdfde830b42e249c2cdada42b12
Raspberry Pi + Arduino
M5Stack
まとめ
実世界プログラミングは将来は必須
まだまだ発展途上
プログラミング環境
センサ、ハード
全世界プログラミングを楽しもう!